#include<iostream>
#include<unistd.h>
#include<thread>
using namespace std;

class TA
{
public:
    TA(int &i):m_i(i){
        cout<<"TA 构造函数"<<endl;
    }
    TA(const TA& ta):m_i(ta.m_i){
        cout<<"TA(const &TA)"<<endl;
    }
    void operator()() 
    {
        cout<<"TA thread begin"<<endl;
        cout<<"m_i:"<<m_i<<endl;
        sleep(1);
        cout<<"m_i:"<<m_i<<endl;
        cout<<"TA thread end   "<<endl;
    }
    ~TA(){
        cout<<"析构函数被执行"<<endl;
    }

private:
    int &m_i;
};

int main()
{
    //大家可能还有一个疑问：一旦调用detach()，那我主线程执行结束了，我这里用的这个ta这个
    //对象还在吗？（对象不在了）因为这个对象实际上是被复制到线程中去，执行完主线程后，ta会被销毁，但是所复制的TA对象依旧存在。所以，只要你这个
    //TA类对象里没有引用，没有指针，那么就不会产生问题；

    int i = 8;
    TA ta(i);
    thread p1(ta);
    p1.detach();
    sleep(1);
    cout<<"main pthread end"<<endl;
    //在这种情况下，主线程和p1分离执行，如果在主线程先执行完的情况下，会释放掉线程资源，
    //i的引用就可能会引用到一个无效值，产生不可预料的结果
    return 0;
}